package com.sky.pool;


import java.util.LinkedList;
import java.util.List;


/**
 * 一个简陋的线程池 ; 一个完善的线程池并不像下面的例子那样简单 ， 它需要提供启动、销毁、增加 工作线程的策略 ，
 * 最大工作线程数，各种状态的获取等操作，而且工作线程也不可能始终做无 用循环，
 * 需要对任务队列使用 wait 、 notify 优化 ， 或者将任务队列改用为阻塞队列 。
 */
public class ThreadPool {


    private WorkerThread[] workerThreads;
    private List<Runnable> taskQueue = new LinkedList<>();


    private ThreadPool(int workNum) {

        workerThreads = new WorkerThread[workNum];

        for (int i = 0; i < workNum; i++) {
            workerThreads[i] = new WorkerThread();
            workerThreads[i].start();
        }
    }


    private void execute(Runnable task) {

        synchronized (taskQueue) {
            taskQueue.add(task);
        }

    }


    private class WorkerThread extends Thread {

        @Override
        public void run() {
            Runnable r = null;
            while (true) {
                synchronized (taskQueue) {

                    if (!taskQueue.isEmpty()) {
                        r = taskQueue.remove(0);
                        r.run();
                    }

                }
            }
        }
    }


    public static void main(String[] args) {


        ThreadPool threadPool = new ThreadPool(4);
        threadPool.execute(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 10; i++) {
                    try {
                        java.lang.Thread.sleep(100);
                        System.out.println(java.lang.Thread.currentThread().getName());
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        });

    }


}
